// #include <iostream>
// #include <string>
// #include <chrono>
// #include <random>
// #include <sstream>
// #include <atomic>
// #include <iomanip>
// #include "text.json.hpp"
// #include "text.asyn.hpp"
// #include "text_muduo.hpp"
// int main()
// {
//     // json的使用
//     // test_json();
//     // 同步异步使用
//     // test_asyn();
//     test_muduo();
//     return 0;
// }


// #include <iostream>
// #include<iomanip>
// using namespace std;
// int main()
// {
//     // cout<<'s'<<setfill('*')<<setw(8)<<'a'<<endl;
//     cout<<'s'<<setw(8)<<setfill('x')<<'a'<<endl;

//     return 0;
// }
// std::string uuid()
// {
//     // 返回对象
//     std::stringstream ss;
//     // 构造机器随机对象
//     std::random_device rd;
//     // 根据机器随机对象构造伪随机对象
//     std::mt19937 generator(rd());
//     // 构造限定数据范围
//     std::uniform_int_distribution<int> distribution(0, 255);
//     // std::cout << distribution(generator) << std::endl;
//     // 生成随机数
//     for(int i = 0; i < 8; i++)
//     {
//         if(i == 4 || i == 6)
//             ss << "-";
//         // 以十六进制生成
//         ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
//     }
//     ss << '-';
//     static std::atomic<size_t> seq(1);
//     size_t cur = seq.fetch_add(1);
//     for (int i = 7; i >= 0; i--) 
//     {
//         if (i == 5) ss << "-";
//         // 以十六进制生成数字
//         ss << std::setw(2) << std::setfill('0') << std::hex << ((cur >> (i*8)) & 0xFF);
//     }
//     // std::cout << ss.str() << std::endl;
//     return ss.str();
// }



#include <iostream>
#include <thread>
#include <atomic>
#include <functional>
using namespace std;

struct Counter
{
    void increment()
    {
        for (int i = 0; i < 10; ++i)
        {
            m_value++;
            cout << "increment number: " << m_value
                << ", theadID: " << this_thread::get_id() << endl;
            this_thread::sleep_for(chrono::milliseconds(500));
        }
    }

    void decrement()
    {
        for (int i = 0; i < 10; ++i)
        {
            m_value--;
            cout << "decrement number: " << m_value
                << ", theadID: " << this_thread::get_id() << endl;
            this_thread::sleep_for(chrono::milliseconds(500));
        }
    }
    // atomic<int> == atomic_int
//private:
    atomic<int> m_value = 0;
};


int main()
{
    Counter c;
    auto increment = bind(&Counter::increment, &c);
    auto decrement = bind(&Counter::decrement, &c);
    thread t1(increment);
    thread t2(decrement);

    t1.join();
    t2.join();

    return 0;
}

// int main()
// {
//     std::cout << uuid() << std::endl;
//     return 0;
// }
 
 